package cn.amebius.code;

import java.util.Stack;

/**
 * @Author 阿伟
 * @Date 2022/10/9 15:51
 */
/*
        来源：力扣（LeetCode）
        链接：https://leetcode.cn/problems/score-of-parentheses

        给定一个平衡括号字符串 S，按下述规则计算该字符串的分数：
            - () 得 1 分。
            - AB 得 A + B 分，其中 A 和 B 是平衡括号字符串。
            - (A) 得 2 * A 分，其中 A 是平衡括号字符串。
        输入： "()"    "(())"   "(()(()))"
        输出：   1        2         6
        S 是平衡括号字符串，且只含有 ( 和 ) 。
        2 <= S.length <= 50
        思路：
        顺序读入栈，遇到"("直接压入，遇到")"栈弹出，直到弹出"("
        其中弹出有两种状态：(),(A...)，第一种直接压入1，第二种把()内的数字进行计算压入栈
        最后把整个栈都弹出，栈中数字相加，最终结果就为答案

*/
public class 括号的分数856 {

    public static void main(String[] args) {
        String s = "(()())";
        System.out.println(sumStack(s));
    }
    static Integer sumStack(String s){
        int len = s.length();
        int pot = 0, num = 0;
        Stack<Character> stack = new Stack<Character>();
        while (pot < len) {
            if (s.charAt(pot) == '(') {
                stack.push(s.charAt(pot));
            } else if (s.charAt(pot) == ')') {
                Character c = stack.pop();
                if (c == '(') {
                    stack.push('1');
                } else {
                    int sum = c - '0';
                    while ((c = stack.pop()) != '(') {
                        sum += c - '0';
                    }
                    stack.push((char) ((sum << 1) + '0'));
                }
            }
            pot++;
        }
        while (!stack.isEmpty()) {
            num +=  stack.pop() - '0';
        }
        return num;
    }
}
